package jp.ac.aiit.yc.softarch.hbcp.service.kj;

import java.util.LinkedList;
import java.util.List;

import jp.ac.aiit.yc.softarch.hbcp.model.kj.Card;
import jp.ac.aiit.yc.softarch.hbcp.model.kj.History;
import jp.ac.aiit.yc.softarch.hbcp.service.common.CalendarUtil;
import jp.ac.aiit.yc.softarch.hbcp.service.common.DataAccessObject;

public class KjService {

	private static List<Card> cards = new LinkedList<Card>();
	static {
		try{
			System.out.println("initializing KjService : " + CalendarUtil.nowDate());
			cards = DataAccessObject.readCards();//サーバ起動時に、DBに存在するカード情報をすべて取得する
		}catch(Exception e){
			System.out.println(e);
		}
	}

	public void saveCard(Card card) throws Exception{
		System.out.println("doing KjService.saveCard() : " + CalendarUtil.nowDate());
		for (int i = 0;i < cards.size();i++) {//引数で渡されたカードが、すでにサーバ側に存在するかチェックする
			if (cards.get(i).getUid().equals(card.getUid())) {
				cards.set(i, card);//サーバ側のカード情報を更新する
				DataAccessObject.updateCard(card);//DBのカード情報を更新する
				return ;
			}
		}
		cards.add(card);//サーバ側にカード情報を追加する
		DataAccessObject.insertCard(card);//DBに新しいカードを作成する
	}

	public void saveCard(Card card,String op,String userName) throws Exception{//カード情報の保存
		System.out.println("doing KjService.saveCard() : " + CalendarUtil.nowDate());
		for (int i = 0;i < cards.size();i++) {//引数で渡されたカードが、すでにサーバ側に存在するかチェックする
			if (cards.get(i).getUid().equals(card.getUid())) {
				cards.set(i, card);//サーバ側のカード情報を更新する
				DataAccessObject.updateCard(card);//DBのカード情報を更新する
				DataAccessObject.insertCardOpHistory(card,op,userName);//DBにカード操作履歴を追加する。
				int id = HistoryManagementService.history.size() + 1;
				HistoryManagementService.history.add(new History(id,card.getTitle(),card.getContent(),op,userName,CalendarUtil.nowDate()));//ヒストリの追加
				return ;
			}
		}
		cards.add(card);//サーバ側にカード情報を追加する
		DataAccessObject.insertCard(card);//DBに新しいカードを作成する
		DataAccessObject.insertCardOpHistory(card,op,userName);//DBにカード操作履歴を追加する。
		int id = HistoryManagementService.history.size() + 1;
		HistoryManagementService.history.add(new History(id,card.getTitle(),card.getContent(),op,userName,CalendarUtil.nowDate()));//ヒストリの追加
	}

	public void toFront(Card card) {//カードの最前面表示
		System.out.println("doing KjService.toFront() : " + CalendarUtil.nowDate());
		for (int i = 0;i < cards.size();i++) {
			if (cards.get(i).getUid().equals(card.getUid())) {
				Card c = cards.remove(i);
				cards.add(c);
				return ;
			}
		}
	}
	public List<Card> getCards() {//サーバ上の全カード情報の取得
		System.out.println("doing KjService.getCards() : " + CalendarUtil.nowDate());
		return cards;
	}

	public void deleteCard(Card card) throws Exception{//カードの削除
		System.out.println("doing deleteCard.() : " + CalendarUtil.nowDate());
		for (int i = 0;i < cards.size();i++) {
			if (cards.get(i).getUid().equals(card.getUid())) {
				cards.remove(i);
				DataAccessObject.deleteCard(card);//DB上のカード情報を削除する
				return ;
			}
		}
	}
}
